package Fisica;

import java.util.Iterator;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;

import Hibernate.Cliente;
import Hibernate.Dueno;
import Hibernate.Vehiculo;

public abstract class DuenoFisica {

	
	private static Cliente c;

	//Busca un Dueno a partir de un identificador OK
    public static Dueno findById(Integer id) {
  	try {
	    	Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	                
	        Query query = session
	        .createQuery("from Dueno as a where a.idduenio = '"+id+"'");
	        List<Dueno> list = query.list();
	        
	        session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
	        								   //El commit cierra automnticamente la session.
	        SessionFactoryUtil.getSessionFactory().close();
	
	        if (list.isEmpty()) 
	        	{	System.out.println("No se encontro el Dueno");
	        		return new Dueno();
	        	}
	        else {	System.out.println("Se encontro el Dueno!!!");
	        		return list.get(0);
	        	}
	       }catch (RuntimeException re) {
				System.out.println("get failed: "+re);
				throw re;
			}
   }
    
  //Busca un Dueno a partir de un identificador de vehiculo OK
    public static Dueno findByIdVehiculo(Integer id) {
  	try {
	    	Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	                
	        Query query = session
	        .createQuery("from Dueno as d where d.vehiculo = '"+id+"'");
	        List<Dueno> list = query.list();
	        
	        session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
	        								   //El commit cierra automnticamente la session.
	        SessionFactoryUtil.getSessionFactory().close();
	
	        if (list.isEmpty()) 
	        	{	System.out.println("No se encontro el Vehiculo del dueno");
	        		return new Dueno();
	        	}
	        else {	System.out.println("Se encontro el Vehiculo del dueno!!!");
	        		return list.get(0);
	        	}
	       }catch (RuntimeException re) {
				System.out.println("get failed: "+re);
				throw re;
			}
   }
    
  //Busca un Dueno a partir de un identificador de cliente OK
    public static Cliente findClienteByPatente(String patente) {
  	try {
	    	Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	                
	        Query query = session
	        .createQuery("select c "
	        		+ "from Dueno as d, Cliente as c "
	        		+ "where d.idcliente = c.idcliente "
	        		+ "and d.patente = '"+patente+"'");
	        List<Cliente> list = query.list();
	        
	        session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
	        								   //El commit cierra automnticamente la session.
	        SessionFactoryUtil.getSessionFactory().close();
	
	        if (list.isEmpty()) 
	        	{	System.out.println("No se encontro el Cliente del dueno");
	        		return new Cliente();
	        	}
	        else {	System.out.println("Se encontro el Cliente del dueno!!!");
	        		return list.get(0);
	        	}
	       }catch (RuntimeException re) {
				System.out.println("get failed: "+re);
				throw re;
			}
   }
    
    
  //Busca un Dueno a partir de un objeto Dueno OK
	public static Dueno find(Dueno c) {
		return DuenoFisica.findById(c.getIdduenio());
    }
    
  //Busca un Dueno a partir de un identificador OK
    public static Dueno findByPatente(String str) {
    	try {
	    	Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	                
	        Query query = session
	        		.createQuery("from Dueno as a where a.patente = '"+str+"'");
//	        		.createQuery("select a.idduenio from Dueno as a where a.patente = '"+str+"'");
	       
	        List<Dueno> list = query.list(); 
	        
	        session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
	        								   //El commit cierra automnticamente la session.
	        SessionFactoryUtil.getSessionFactory().close();
	
	        if (list.isEmpty()) 
	        	{	System.out.println("No se encontro la Patente");
	        		return new Dueno();
	        	}
	        else {	System.out.println("Se encontro la Patente!!!");
	        		return list.get(0);
	        	}
	       }catch (RuntimeException re) {
				System.out.println("get failed: "+re);
				throw re;
			}
   }
    
  //Busca un Dueno a partir de un identificador OK
    public static List<Dueno> findByCliente(int id) {
    	try {
	    	Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	                
	        Query query = session
	        		.createQuery("from Dueno as a where a.idcliente = "+id);
//	        		.createQuery("select a.idduenio from Dueno as a where a.patente = '"+str+"'");
	       
	        List<Dueno> list = query.list(); 
	        
	        session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
	        								   //El commit cierra automnticamente la session.
	        SessionFactoryUtil.getSessionFactory().close();
	
	        return list;
	     }catch (RuntimeException re) {
				System.out.println("get failed: "+re);
				throw re;
			}
   }
    
  //Busca un Dueno a partir de un identificador OK
    public static boolean existe(String str) {
    	try {
	    	Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	                
	        Query query = session
	        .createQuery("from Dueno as a where a.patente like '"+str+"'");
//	        .createQuery("select a.idduenio as idduenio, a.vehiculo.idvehiculo as idvehiculo,"
//	        		+ " a.cliente.idcliente as idcliente, a.patente as patente, a.ano as ano, "
//	        		+ "a.color as color "
//	        		+ "from Dueno as a where a.patente like '"+str+"'");
//	        int cant = query.list().size();
	        List<Dueno> list = query.list();
	        
	        session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
	        								   //El commit cierra automnticamente la session.
	        SessionFactoryUtil.getSessionFactory().close();
	
//	        if (cant > 0) 
	        if (!list.isEmpty())  
	        	{	System.out.println("Se encontro la Patente");
	        		return true;
	        	}
	        else {	System.out.println("NO Se encontro la Patente!!!");
	        		return false;
	        	}
	       }catch (RuntimeException re) {
				System.out.println("get failed: "+re);
				throw re;
			}
   }
    
  //Busca un Dueno a partir de un identificador OK
    public static List<Dueno> list() {
    	try {
	    	Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
		    session.beginTransaction();
		                
		    Query query = session.createQuery("from Dueno as o order by o.idduenio asc");
		    List<Dueno> list = query.list();
		        
		    session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
		        								   //El commit cierra automnticamente la session.
		    SessionFactoryUtil.getSessionFactory().close();
		
		    return list;	 
    	}catch (RuntimeException re) {
			System.out.println("get failed: "+re);
			throw re;
		}
   }
    
  //Agrego un Dueno a la base OK
	public static void add(Dueno c) {
		try{
			Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	        
	        //chekeo que el Dueno no exista para agregarlo
	        Query query = session
	        .createQuery("from Dueno as d where d.patente = '"+c.getPatente()+"'");
	        List<Dueno> list = query.list();
	
	        if (list.isEmpty())
	        {
	        	session.save(c);
	        	System.out.println("Dueno agregado con exito!!!");
	        }else System.out.println("Dueno NO agregado!!!");
	        
	        session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
	        								   //El commit cierra automnticamente la session.
	        SessionFactoryUtil.getSessionFactory().close();
		}catch (RuntimeException re) {
				System.out.println("get failed: "+re);
				throw re;
			}
	}
	
	//Actualizacion de un Dueno OK
	public static void update(Dueno c) {
		try{
	        Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	        
	        //chekeo que el Dueno no exista para agregarlo 
	        System.out.println("chekeo que el Dueno no exista para agregarlo ");
	        if (c.getIdduenio() != 0) {
	        	session.saveOrUpdate(c);
	            System.out.println("Dueno actualizado con exito!!!");
	        }
	               
	        session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. El commit cierra automnticamente la session.
	        SessionFactoryUtil.getSessionFactory().close();
		}catch (RuntimeException re) {
				System.out.println("get failed: "+re);
				throw re;
			}
    }
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int x = 1;
		String s = "XPF987";
//		Dueno c1 = DuenoFisica.existe(s);
		
//		System.out.println("EXISTE ID= 1: "+ DuenoFisica.findById(1).getPatente());
		System.out.println("EXISTE = DPP123: "+ DuenoFisica.existe("dpp123"));
//		System.out.println("EXISTE = DPP123: "+ DuenoFisica.findByPatente("dpp123"));
		
//		Dueno c1 = DuenoFisica.findByPatente(s);
////		Dueno c = DuenoFisica.findById(x);
////		c1.setIdduenio(1);
//		System.out.println("c1.getVehiculo(): "+c1.getVehiculo().getIdvehiculo() );
//		System.out.println("c1.getCliente(): "+c1.getCliente().getIdcliente() );
//		System.out.println("c1.getPatente(): "+c1.getPatente() );
//		System.out.println("c1.getAno(): "+c1.getAno() );
//		System.out.println("c1.getColor(): "+c1.getColor() );
//		System.out.println("c1.getIdduenio(): "+c1.getIdduenio() );
//		System.out.println("c1.getIdduenio() == 0: "+(c1.getIdduenio() == 0) );
//		
//		List<Dueno> l = DuenoFisica.list();
//		System.out.println("ID  |    VEHICULO   |  CLIENTE  |   PATENTE  |   COLOR   |  AnO");
//		for (Dueno cl : l) {
//			System.out.print(cl.getIdduenio() );
//			System.out.print(" | ");
//			System.out.print(cl.getVehiculo().getIdvehiculo() );
//			System.out.print(" | ");
//			System.out.print(cl.getCliente().getIdcliente());
//			System.out.print(" | ");
//			System.out.print(cl.getPatente() );
//			System.out.print(" | ");
//			System.out.print(cl.getColor() );
//			System.out.print(" | ");
//			System.out.println(cl.getAno() );			
//		} 
		
//		Vehiculo v = VehiculoFisica.findById(10);
//	    Cliente c = ClienteFisica.findById(3);
//		Dueno cu = DuenoFisica.findById(6);
//		cu.setIdduenio(6);
//		cu.setVehiculo(v);
//		cu.setCliente(c);
//		cu.setPatente("OOP987");
//		cu.setAno(2012);
//		cu.setColor("rosado");
//		DuenoFisica.add(cu);
//		
//		
//		DuenoFisica.update(cu);
		

	}

}
